package com.study.collection.set;

import java.util.HashSet;
import java.util.Set;

/**
    1）HashSet类
　　HashSet是Set集合最常用实现类，是其经典实现。HashSet是按照hash算法来存储元素的，因此具有很好的存取和查找性能。
　　HashSet具有如下特点：
　　♦ 不能保证元素的顺序。
　　♦ HashSet不是线程同步的，如果多线程操作HashSet集合，则应通过代码来保证其同步。
　　♦ 集合元素值可以是null。
　　HashSet存储原理如下：
　　  当向HashSet集合存储一个元素时，HashSet会调用该对象的hashCode()方法得到其hashCode值，然后根据hashCode值决定该对象的存储位置。
   HashSet集合判断两个元素相等的标准是
     (1)两个对象通过equals()方法比较返回true；
     (2)两个对象的hashCode()方法返回值相等。
     因此，如果(1)和(2)有一个不满足条件，则认为这两个对象不相等，可以添加成功。
     如果两个对象的hashCode()方法返回值相等，但是两个对象通过equals()方法比较返回false，
     HashSet会以链式结构将两个对象保存在同一位置，
     这将导致性能下降，因此在编码时应避免出现这种情况。
　　HashSet查找原理如下：
　　基于HashSet以上的存储原理，在查找元素时，HashSet先计算元素的HashCode值（也就是调用对象的hashCode方法的返回值），
    然后直接到hashCode值对应的位置去取出元素即可，这就是HashSet速度很快的原因。
　　重写hashCode()方法的基本原则如下：
　　♦ 在程序运行过程中，同一个对象的hashCode()方法返回值应相同。
　　♦ 当两个对象通过equals()方法比较返回true时，这两个对象的hashCode()方法返回值应该相等。
　　♦ 对象中用作equals()方法比较标准的实例变量，都应该用于计算hashCode值。
*/
public class HashSetTest {

    /**
     *
     * @param args
     */
    public static void main(String[] args) {
        Set<String> set = new HashSet<String>();
        set.add("hello world");
        set.add("hello 冰湖一角");
        set.add("hello 冰湖一角");//添加不进去
        System.out.println("集合中元素个数："+set.size());
        System.out.println("集合中元素为："+set.toString());
    }
}
